import json
import os
import requests
from dotenv import load_dotenv
from typing import Any
from mcp.server.fastmcp import FastMCP

load_dotenv()

mcp = FastMCP("HoroscopeServer")


JUHE_BASE_URL = "http://web.juhe.cn/constellation/getAll"
JUHE_API_KEY = os.getenv("JUHE_API_KEY")

async def fetch_horoscope(consName: str, type: str):
    """
    从聚合数据 API获取星座运势信息。
    :param consName: 星座名称，如:双鱼座
    :param type: 运势类型：today,tomorrow,week,month,year
    :return: 星座运势，若出错返回包含error信息字典
    """

    params = {
        "key": JUHE_API_KEY,
        "consName": consName,
        "type": type
    }


    try:
        # 发起接口网络请求
        response = requests.get(JUHE_BASE_URL, params=params)

        # 解析响应结果
        if response.status_code == 200:
            responseResult = response.json()
            # 网络请求成功。可依据业务逻辑和接口文档说明自行处理。
            return responseResult
        else:
            # 网络异常等因素，解析结果异常。可依据业务逻辑自行处理。
            return {"error": f"请求异常:{response.json()}"}
    except Exception as e:
        return {"error": f"HTTP错误：{str(e)}"}


def format_horoscope(data: dict[str, Any] | str) -> str:
    """
    将星座运势数据格式化为易读文本。
    :param data: 星座运势数据（可以是字典或JSON字符）
    :return: 格式化后的星座运势信息字符串
    """
    if isinstance(data, str):
        try:
            data = json.loads(data)
        except Exception as e:
            return f"无法解析星座运势数据{str(e)}"

    if "error" in data:
        return f"⚠ {data['error']}"

    # 获取公共字段
    type = data.get("type", "today")
    name = data.get("name", "未知星座")
    error_code = data.get("error_code", 0)
    datetime = data.get("datetime") or data.get("date", "日期未知")
    
    # 根据不同类型进行格式化
    if type in ["today", "tomorrow"]:
        return _format_daily(data, datetime, name)
    elif type == "week":
        return _format_weekly(data, datetime, name)
    elif type == "month":
        return _format_monthly(data, datetime, name)
    elif type == "year":
        return _format_yearly(data, datetime, name)
    else:
        return f"⚠ 未知的运势类型：{type}"

def _format_daily(data: dict, date: str, name: str) -> str:
    """格式化日运势"""
    return (
        f"✨【{name}】{date}运势\n"
        f"🔮速配星座：{data.get('QFriend', '未知')}\n"
        f"🎨幸运色：{data.get('color', '未知')}  "
        f"🧬健康指数：{data.get('health', '未知')}\n"
        f"💖爱情指数：{data.get('love', '未知')}  "
        f"💰财运指数：{data.get('money', '未知')}\n"
        f"📊工作指数：{data.get('work', '未知')}  "
        f"🍀综合指数：{data.get('all', '未知')}\n"
        f"🔢幸运数字：{data.get('number', '未知')}\n"
        f"📝运势概览：{data.get('summary', '暂无概述')}"
    )

def _format_weekly(data: dict, date_range: str, name: str) -> str:
    """格式化周运势"""
    return (
        f"🌟【{name}】{date_range}周运势\n"
        f"🏥健康运势：{data.get('health', '暂无信息')}\n"
        f"💼工作运势：{data.get('work', '暂无信息')}\n"
        f"💘爱情运势：{data.get('love', '暂无信息')}\n"
        f"💸财运运势：{data.get('money', '暂无信息')}\n"
        f"📈事业运势：{data.get('job', '暂无信息')}"
    )

def _format_monthly(data: dict, month: str, name: str) -> str:
    """格式化月运势"""
    return (
        f"🌕【{name}】{month}月运势\n"
        f"📌综合运势：{data.get('all', '暂无信息')}\n"
        f"❤️爱情运势：{data.get('love', '暂无信息')}\n"
        f"💵财运运势：{data.get('money', '暂无信息')}\n"
        f"🏢工作运势：{data.get('work', '暂无信息')}\n"
        f"🏥健康提示：{data.get('health', '暂无信息')}"
    )

def _format_yearly(data: dict, year: str, name: str) -> str:
    """格式化年运势"""
    mima = data.get('mima', {})
    career = '\n'.join(data.get('career', ['暂无信息']))
    love = '\n'.join(data.get('love', ['暂无信息']))
    finance = '\n'.join(data.get('finance', ['暂无信息']))
    
    return (
        f"🎇【{name}】{year}年运势\n"
        f"🔑年度密码：{mima.get('info', '未知')}\n"
        f"📌密码解读：{mima.get('text', [''])[0][:50]}...\n\n"
        f"💼事业运势：\n{career[:200]}...\n\n"
        f"💞感情运势：\n{love[:200]}...\n\n"
        f"💰财运分析：\n{finance[:200]}..."
    )

@mcp.tool()
async def query_horoscope(consName: str, type: str):
    """
    输入指定的星座（例如:双鱼座）和运势类型（例如：today,tomorrow,week,month,year）
    :param consName: 星座名称，如:双鱼座
    :param type: 运势类型：today,tomorrow,week,month,year
    :return: 格式化后的星座运势
    """
    response = await fetch_horoscope(consName, type)
    return format_horoscope(response)

if __name__ == "__main__":
    mcp.run(transport='stdio')
